@@ -0,0 +1,59 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.29 on 2020-05-31 18:37  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('account', '0045_userinfo_new_subscribe'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AddField(  | 
            |
| 16 | 
                + model_name='userinfo',  | 
            |
| 17 | 
                + name='is_maintenance',  | 
            |
| 18 | 
                + field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u7ef4\u4fee\u5458', verbose_name='is_maintenance'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + migrations.AddField(  | 
            |
| 21 | 
                + model_name='userinfo',  | 
            |
| 22 | 
                + name='userid',  | 
            |
| 23 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u4f01\u4e1a\u5fae\u4fe1 userid', max_length=32, null=True, verbose_name='userid'),  | 
            |
| 24 | 
                + ),  | 
            |
| 25 | 
                + migrations.AlterField(  | 
            |
| 26 | 
                + model_name='userinfo',  | 
            |
| 27 | 
                + name='openid',  | 
            |
| 28 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid'),  | 
            |
| 29 | 
                + ),  | 
            |
| 30 | 
                + migrations.AlterField(  | 
            |
| 31 | 
                + model_name='userinfo',  | 
            |
| 32 | 
                + name='openid_lensman',  | 
            |
| 33 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_lensman'),  | 
            |
| 34 | 
                + ),  | 
            |
| 35 | 
                + migrations.AlterField(  | 
            |
| 36 | 
                + model_name='userinfo',  | 
            |
| 37 | 
                + name='openid_miniapp',  | 
            |
| 38 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_miniapp'),  | 
            |
| 39 | 
                + ),  | 
            |
| 40 | 
                + migrations.AlterField(  | 
            |
| 41 | 
                + model_name='userinfo',  | 
            |
| 42 | 
                + name='openid_oauth',  | 
            |
| 43 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_oauth'),  | 
            |
| 44 | 
                + ),  | 
            |
| 45 | 
                + migrations.AlterField(  | 
            |
| 46 | 
                + model_name='userinfo',  | 
            |
| 47 | 
                + name='openid_tourguide',  | 
            |
| 48 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_tourguide'),  | 
            |
| 49 | 
                + ),  | 
            |
| 50 | 
                + migrations.AlterField(  | 
            |
| 51 | 
                + model_name='userinfo',  | 
            |
| 52 | 
                + name='user_from',  | 
            |
| 53 | 
                + field=models.IntegerField(choices=[(0, 'APP \u521b\u5efa\u7528\u6237'), (1, '\u5fae\u4fe1\u6388\u6743\u7528\u6237'), (8, '\u7528\u6237\u7aef\u7528\u6237'), (9, '\u6e38\u5ba2\u7528\u6237'), (10, '\u6444\u5f71\u5e08\u7aef\u7528\u6237'), (11, '\u5bfc\u6e38\u7aef\u7528\u6237'), (12, '\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (22, '\u4f01\u4e1a\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (13, '\u7f51\u9875\u6388\u6743\u7528\u6237')], default=0, help_text='\u7528\u6237\u6765\u6e90', verbose_name='user_from'),  | 
            |
| 54 | 
                + ),  | 
            |
| 55 | 
                + migrations.AlterUniqueTogether(  | 
            |
| 56 | 
                + name='userinfo',  | 
            |
| 57 | 
                +            unique_together=set([('appid', 'userid')]),
               | 
            |
| 58 | 
                + ),  | 
            |
| 59 | 
                + ]  | 
            
                @@ -256,6 +256,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 256 | 256 | 
                LENSMAN_USER = 10  | 
            
| 257 | 257 | 
                TOURGUIDE_USER = 11  | 
            
| 258 | 258 | 
                MINIAPP_USER = 12  | 
            
| 259 | 
                + QYMINIAPP_USER = 22  | 
            |
| 259 | 260 | 
                OAUTH_USER = 13  | 
            
| 260 | 261 | 
                 | 
            
| 261 | 262 | 
                USER_FROM = (  | 
            
                @@ -266,6 +267,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 266 | 267 | 
                (LENSMAN_USER, u'摄影师端用户'),  | 
            
| 267 | 268 | 
                (TOURGUIDE_USER, u'导游端用户'),  | 
            
| 268 | 269 | 
                (MINIAPP_USER, u'小程序端用户'),  | 
            
| 270 | 
                + (QYMINIAPP_USER, u'企业微信小程序端用户'),  | 
            |
| 269 | 271 | 
                (OAUTH_USER, u'网页授权用户'),  | 
            
| 270 | 272 | 
                )  | 
            
| 271 | 273 | 
                 | 
            
                @@ -317,11 +319,13 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 317 | 319 | 
                # 微信授权用户  | 
            
| 318 | 320 | 
                appid = models.CharField(_(u'appid'), max_length=32, blank=True, null=True, help_text=u'appId', db_index=True)  | 
            
| 319 | 321 | 
                unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True)  | 
            
| 320 | 
                - openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户端', db_index=True, unique=True)  | 
            |
| 321 | 
                - openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱摄影师端', db_index=True, unique=True)  | 
            |
| 322 | 
                - openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱导游端', db_index=True, unique=True)  | 
            |
| 323 | 
                - openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱小程序', db_index=True, unique=True)  | 
            |
| 324 | 
                - openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户授权', db_index=True, unique=True)  | 
            |
| 322 | 
                + openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)  | 
            |
| 323 | 
                + openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)  | 
            |
| 324 | 
                + openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)  | 
            |
| 325 | 
                + openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)  | 
            |
| 326 | 
                + openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)  | 
            |
| 327 | 
                + # 企业微信授权用户  | 
            |
| 328 | 
                + userid = models.CharField(_(u'userid'), max_length=32, blank=True, null=True, help_text=u'企业微信 userid', db_index=True)  | 
            |
| 325 | 329 | 
                # 用户基本信息  | 
            
| 326 | 330 | 
                name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名')  | 
            
| 327 | 331 | 
                sex = models.IntegerField(_(u'sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.UNKNOWN, help_text=u'用户性别')  | 
            
                @@ -373,10 +377,17 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 373 | 377 | 
                shots_num = models.IntegerField(_(u'shots_num'), default=0, help_text=u'主持镜头数')  | 
            
| 374 | 378 | 
                level = models.IntegerField(_(u'level'), choices=LEVEL_TUPLE, default=MEMBER_NO, help_text=u'会员等级')  | 
            
| 375 | 379 | 
                 | 
            
| 380 | 
                + # 维修员信息  | 
            |
| 381 | 
                + is_maintenance = models.BooleanField(_(u'is_maintenance'), default=False, help_text=_(u'是否维修员'), db_index=True)  | 
            |
| 382 | 
                +  | 
            |
| 376 | 383 | 
                class Meta:  | 
            
| 377 | 384 | 
                verbose_name = _(u'userinfo')  | 
            
| 378 | 385 | 
                verbose_name_plural = _(u'userinfo')  | 
            
| 379 | 386 | 
                 | 
            
| 387 | 
                + unique_together = (  | 
            |
| 388 | 
                +            ('appid', 'userid'),
               | 
            |
| 389 | 
                + )  | 
            |
| 390 | 
                +  | 
            |
| 380 | 391 | 
                def __unicode__(self):  | 
            
| 381 | 392 | 
                return unicode(self.pk)  | 
            
| 382 | 393 | 
                 | 
            
                @@ -462,6 +473,8 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 462 | 473 | 
                'freeze_integral': self.freeze_integral,  | 
            
| 463 | 474 | 
                'shots_num': self.shots_num,  | 
            
| 464 | 475 | 
                'level': self.level,  | 
            
| 476 | 
                + # 维修员信息  | 
            |
| 477 | 
                + 'is_maintenance': self.is_maintenance,  | 
            |
| 465 | 478 | 
                }  | 
            
| 466 | 479 | 
                 | 
            
| 467 | 480 | 
                @property  | 
            
                @@ -163,7 +163,6 @@ def query_usercoupons(request):  | 
            ||
| 163 | 163 | 
                 | 
            
| 164 | 164 | 
                     coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at')
               | 
            
| 165 | 165 | 
                coupons = [coupon.admindata for coupon in coupons]  | 
            
| 166 | 
                - print coupons  | 
            |
| 167 | 166 | 
                 | 
            
| 168 | 167 | 
                     return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={
               | 
            
| 169 | 168 | 
                'coupons': coupons,  | 
            
                @@ -13,7 +13,7 @@ from group import (groupuser_views, lensman_views, tourguidegroup_views, tourgui  | 
            ||
| 13 | 13 | 
                tourguidegroupuser_views)  | 
            
| 14 | 14 | 
                from group import views as group_views  | 
            
| 15 | 15 | 
                from message import views as message_views  | 
            
| 16 | 
                -from miniapp import views as mini_views  | 
            |
| 16 | 
                +from miniapp import views as mini_views, qy_views  | 
            |
| 17 | 17 | 
                from operation import views as op_views  | 
            
| 18 | 18 | 
                from page import oauth_views, sale_views, screen_views  | 
            
| 19 | 19 | 
                from pay import views as pay_views  | 
            
                @@ -184,6 +184,8 @@ urlpatterns += [  | 
            ||
| 184 | 184 | 
                url(r'^mini/userinfo$', mini_views.get_userinfo_api, name='get_userinfo_api'), # 获取用户信息  | 
            
| 185 | 185 | 
                url(r'^mini/login$', mini_views.mini_login_api, name='mini_login_api'), # 小程序登录  | 
            
| 186 | 186 | 
                url(r'^mini/userinfo2$', mini_views.get_userinfo_api2, name='get_userinfo_api2'), # 获取用户信息  | 
            
| 187 | 
                +  | 
            |
| 188 | 
                + url(r'^qy/login$', qy_views.qy_login_api, name='qy_login_api'), # 小程序登录  | 
            |
| 187 | 189 | 
                ]  | 
            
| 188 | 190 | 
                 | 
            
| 189 | 191 | 
                urlpatterns += [  | 
            
                @@ -440,6 +440,9 @@ COMPONENT_CALLBACK_CONFIG = {
               | 
            ||
| 440 | 440 | 
                # 测试文件  | 
            
| 441 | 441 | 
                 TESTING_ZBAR = os.path.join(BASE_DIR, 'utils/zbar/zbar.jpg').replace('\\', '/')
               | 
            
| 442 | 442 | 
                 | 
            
| 443 | 
                +# QY  | 
            |
| 444 | 
                +QY_MAINTENANCE_USERID = []  | 
            |
| 445 | 
                +  | 
            |
| 443 | 446 | 
                # 开发调试相关配置  | 
            
| 444 | 447 | 
                if DEBUG:  | 
            
| 445 | 448 | 
                try:  | 
            
                @@ -0,0 +1,70 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +import logging  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.conf import settings  | 
            |
| 6 | 
                +from django.db import transaction  | 
            |
| 7 | 
                +from django_curtail_uuid import CurtailUUID  | 
            |
| 8 | 
                +from django_logit import logit  | 
            |
| 9 | 
                +from django_response import response  | 
            |
| 10 | 
                +from ipaddr import client_ip  | 
            |
| 11 | 
                +from pyqywe_miniapp import get_userid  | 
            |
| 12 | 
                +from pywe_storage import RedisStorage  | 
            |
| 13 | 
                +from TimeConvert import TimeConvert as tc  | 
            |
| 14 | 
                +  | 
            |
| 15 | 
                +from account.models import UserInfo  | 
            |
| 16 | 
                +from statistic.models import RegisterStatisticInfo  | 
            |
| 17 | 
                +from utils.error.errno_utils import ProductBrandStatusCode  | 
            |
| 18 | 
                +from utils.redis.connect import r  | 
            |
| 19 | 
                +from utils.redis.rprofile import set_profile_info  | 
            |
| 20 | 
                +  | 
            |
| 21 | 
                +  | 
            |
| 22 | 
                +WECHAT = settings.WECHAT  | 
            |
| 23 | 
                +logger = logging.getLogger('logit')
               | 
            |
| 24 | 
                +  | 
            |
| 25 | 
                +  | 
            |
| 26 | 
                +@logit(res=True)  | 
            |
| 27 | 
                +@transaction.atomic  | 
            |
| 28 | 
                +def qy_login_api(request):  | 
            |
| 29 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 30 | 
                +    appId = request.POST.get('appId', 'QYMINIAPP')
               | 
            |
| 31 | 
                +  | 
            |
| 32 | 
                + if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            |
| 33 | 
                + return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            |
| 34 | 
                +  | 
            |
| 35 | 
                +    wxcfg = WECHAT.get(appId, {})
               | 
            |
| 36 | 
                +  | 
            |
| 37 | 
                +    appid = wxcfg.get('appID')
               | 
            |
| 38 | 
                +    secret = wxcfg.get('appsecret')
               | 
            |
| 39 | 
                +  | 
            |
| 40 | 
                +    code = request.POST.get('code', '')
               | 
            |
| 41 | 
                +  | 
            |
| 42 | 
                + userid = get_userid(appid=appid, secret=secret, code=code, storage=RedisStorage(r))  | 
            |
| 43 | 
                +  | 
            |
| 44 | 
                + # Get or Create User  | 
            |
| 45 | 
                + user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid)  | 
            |
| 46 | 
                +  | 
            |
| 47 | 
                + # Set User_id  | 
            |
| 48 | 
                + if created:  | 
            |
| 49 | 
                + user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')  | 
            |
| 50 | 
                + # 注册用户统计  | 
            |
| 51 | 
                + rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create(  | 
            |
| 52 | 
                + brand_id=brand_id,  | 
            |
| 53 | 
                + ymd=int(tc.local_string(format='%Y%m%d')),  | 
            |
| 54 | 
                + )  | 
            |
| 55 | 
                + rsi.num += 1  | 
            |
| 56 | 
                + rsi.save()  | 
            |
| 57 | 
                +  | 
            |
| 58 | 
                + # Set User Key's Value  | 
            |
| 59 | 
                + user.user_from = UserInfo.QYMINIAPP_USER  | 
            |
| 60 | 
                + user.appid = appid  | 
            |
| 61 | 
                + user.user_status = UserInfo.ACTIVATED  | 
            |
| 62 | 
                + user.signup_ip = client_ip(request)  | 
            |
| 63 | 
                + user.signup_at = tc.utc_datetime()  | 
            |
| 64 | 
                + user.is_maintenance = userid in settings.QY_MAINTENANCE_USERID  | 
            |
| 65 | 
                + user.save()  | 
            |
| 66 | 
                +  | 
            |
| 67 | 
                + # Store Userinfo  | 
            |
| 68 | 
                + set_profile_info(user)  | 
            |
| 69 | 
                +  | 
            |
| 70 | 
                + return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id))  |